#ifndef LTGSQL_COMMON_H
#define LTGSQL_COMMON_H

/**
 * LTGSQL - Lightweight Transactional Graph SQL Database
 * 核心头文件
 */

#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 版本信息
#define LTGSQL_VERSION_MAJOR 0
#define LTGSQL_VERSION_MINOR 1
#define LTGSQL_VERSION_PATCH 0
#define LTGSQL_VERSION_STRING "0.1.0"

// 平台检测
#if defined(__linux__)
#define LTGSQL_LINUX 1
#elif defined(__APPLE__)
#define LTGSQL_MACOS 1
#elif defined(_WIN32)
#define LTGSQL_WINDOWS 1
#endif

// 错误码
typedef enum {
    LTGSQL_OK = 0,
    LTGSQL_ERROR,
    LTGSQL_IO_ERROR,
    LTGSQL_MEMORY_ERROR,
    LTGSQL_SYNTAX_ERROR,
    LTGSQL_NOT_FOUND,
    LTGSQL_CONFLICT,
    LTGSQL_TIMEOUT,
    LTGSQL_DEADLOCK,
    LTGSQL_NETWORK_ERROR
} ltgsql_status;

// 布尔类型
typedef bool ltgsql_bool;
#define LTGSQL_TRUE true
#define LTGSQL_FALSE false

// 内存分配包装
#define ltgsql_malloc(size) _ltgsql_malloc(size, __FILE__, __LINE__)
#define ltgsql_calloc(count, size) _ltgsql_calloc(count, size, __FILE__, __LINE__)
#define ltgsql_free(ptr) _ltgsql_free(ptr, __FILE__, __LINE__)
#define ltgsql_strdup(str) _ltgsql_strdup(str, __FILE__, __LINE__)

// 日志级别
typedef enum {
    LTGSQL_LOG_DEBUG,
    LTGSQL_LOG_INFO,
    LTGSQL_LOG_WARNING,
    LTGSQL_LOG_ERROR,
    LTGSQL_LOG_FATAL
} ltgsql_log_level;

// 公共函数声明
void* _ltgsql_malloc(size_t size, const char* file, int line);
void* _ltgsql_calloc(size_t count, size_t size, const char* file, int line);
void _ltgsql_free(void* ptr, const char* file, int line);
char* _ltgsql_strdup(const char* str, const char* file, int line);

void ltgsql_log(ltgsql_log_level level, const char* format, ...);

// 断言宏
#define ltgsql_assert(expr) \
    do { \
        if (!(expr)) { \
            ltgsql_log(LTGSQL_LOG_FATAL, "Assertion failed: %s, file %s, line %d", \
                      #expr, __FILE__, __LINE__); \
            abort(); \
        } \
    } while (0)

// 不可达宏
#define LTGSQL_UNREACHABLE() \
    do { \
        ltgsql_log(LTGSQL_LOG_FATAL, "Unreachable code reached: %s, line %d", \
                  __FILE__, __LINE__); \
        abort(); \
    } while (0)

#endif // LTGSQL_H